/*  
  需求：编写服务端，接收客户端发送请求，提取其中两个整型数据，相加后将结果响应回客户端。
  步骤：
    1.包含头文件；
    2.初始化 ROS2 客户端；
    3.定义节点类；
      3-1.创建服务端；
      3-2.处理请求数据并响应结果。
    4.调用spin函数，并传入节点对象指针；
    5.释放资源。
*/

// 1.包含头文件；
#include"rclcpp/rclcpp.hpp"
#include"base_interfaces_demo/srv/add_ints.hpp"

using base_interfaces_demo::srv::AddInts;
using std::placeholders::_1;
using std::placeholders::_2;

// 3.定义节点类；
class Service:public rclcpp::Node
{
public:
    Service():Node("sevice_node_cpp")
    {
        //3-1.创建服务端；
        RCLCPP_INFO(this->get_logger(),"服务端创建，等待客户端请求！");
        server_ = this->create_service<AddInts>("add_ints",std::bind(&Service::add_callback,this,_1,_2));
    }
private:
    //3-2.处理请求数据并响应结果。
    void add_callback(const AddInts::Request::SharedPtr req,const AddInts::Response::SharedPtr res)
    {
        res->sum = req->num1 + req->num2;
        RCLCPP_INFO(this->get_logger(),"请求数据:(%d,%d),响应结果:%d",req->num1,req->num2,res->sum);
    }
    rclcpp::Service<AddInts>::SharedPtr server_;
    
};


int main(int argc, char const *argv[])
{
    // 2.初始化 ROS2 客户端；
    rclcpp::init(argc,argv);
    // 4.调用spin函数，并传入节点对象指针；
    auto server = std::make_shared<Service>();
    rclcpp::spin(server);
    // 5.释放资源。
    rclcpp::shutdown();
    return 0;
}
